package designpatterns.chainofresponsibility.positive;

import com.sun.istack.internal.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//需求：开发现场要对接项目，不知道是谁，只能一个一个问。
//在实际中，人与人之间的关系都是有关联的，我们可以根据这种关系，找一个人，让他带我们去找具体的负责人。
public class Client {
    public static void main(String[] args) {
        //现场人员
        Handler p1 = new Person("p1", Project.LOGISTICS_SYSTEM, null);
        Handler p2 = new Person("p2", Project.PERMISSION_SYSTEM, null);
        Handler p3 = new Person("p3", Project.LOG_SYSTEM, null);
        p1.setNextHandler(p2).setNextHandler(p3).setNextHandler(null);

        Handler me = new Person("w", Project.PORTAL_SYSTEM, null);
        me.setNextHandler(p1);//通过p1去找项目负责人，而不是去把每个人都问一遍。
        Handler person = me.findPerson(Project.LOG_SYSTEM);
        System.out.println(person == null ? "现场无期望负责人" : "现场负责人为：" + person.getName());

//        Handler person02 = me.findPerson(Project.DEVOPS_SYSTEM);
//        System.out.println(person02 == null ? "现场无期望负责人" : "现场负责人为：" + person02.getName());
    }
}

enum Project {
    PERMISSION_SYSTEM, LOG_SYSTEM, PORTAL_SYSTEM, LOGISTICS_SYSTEM, DEVOPS_SYSTEM;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
abstract class Handler {
    private String name;
    private Project myProject;//负责的项目
    private Project expectProject;//期望对接的项目
    private Handler nextHandler;

    abstract Handler findPerson(Project project);

    //链式编程
    public Handler setNextHandler(@NotNull Handler nextHandler) {
        return this.nextHandler = nextHandler;
    }

}

//每个人都有名字和负责的项目
@Data
@NoArgsConstructor
class Person extends Handler {

    public Person(String name, Project myProject, Project expectProject) {
        super(name, myProject, expectProject, null);
    }

    @Override
    Handler findPerson(Project project) {
        //我先去看我朋友是否为想要找的人，如果不是，就让朋友帮我去找。
        Handler friend = this.getNextHandler();
        return friend == null ? null : (project.equals(friend.getMyProject()) ? friend : friend.findPerson(project));
    }
}



